From cb5492634444c23ac43bc8f5ef6e9af5320d9900 Mon Sep 17 00:00:00 2001 From: "kaf24@scramble.cl.cam.ac.uk" Date: Wed, 30 Jul 2003 13:06:06 +0000 Subject: [PATCH] bitkeeper revision 1.378 (3f27c2beWNYX6OSWHkL7l2xJ5Qm9ng) perfc_defn.h, perfc.h, lib.h, vsprintf.c, perfc.c: Cleaned up Xen performance counter mechanism. --- xen/common/perfc.c | 137 ++++++++--------------- xen/common/vsprintf.c | 202 ---------------------------------- xen/include/xeno/lib.h | 3 - xen/include/xeno/perfc.h | 5 - xen/include/xeno/perfc_defn.h | 4 +- 5 files changed, 44 insertions(+), 307 deletions(-) diff --git a/xen/common/perfc.c b/xen/common/perfc.c index 704bef1d3b..412692f768 100644 --- a/xen/common/perfc.c +++ b/xen/common/perfc.c @@ -1,6 +1,3 @@ -/* - * xen performance counters - */ #include #include @@ -8,111 +5,63 @@ #include #include -/* used for different purposes in perfc.h and here */ -#undef PERFCOUNTER -#undef PERFCOUNTER_CPU -#undef PERFCOUNTER_ARRAY - -#define PERFCOUNTER( var, name ) "[0]"name"\0", -#define PERFCOUNTER_CPU( var, name ) "C"name"\0", -#define PERFCOUNTER_ARRAY( var, name, size ) "["#size"]"name"\0", - -char* perfc_name[] = { +#undef PERFCOUNTER +#undef PERFCOUNTER_CPU +#undef PERFCOUNTER_ARRAY +#define PERFCOUNTER( var, name ) { name, TYPE_SINGLE, 0 }, +#define PERFCOUNTER_CPU( var, name ) { name, TYPE_CPU, 0 }, +#define PERFCOUNTER_ARRAY( var, name, size ) { name, TYPE_ARRAY, size }, +static struct { + char *name; + enum { TYPE_SINGLE, TYPE_CPU, TYPE_ARRAY } type; + int nr_elements; +} perfc_info[] = { #include }; -struct perfcounter_t perfcounters; +#define NR_PERFCTRS (sizeof(perfc_info) / sizeof(perfc_info[0])) -void __perfc_print (unsigned long counter[], int offset) -{ - int loop; - int total_size = 0; - int element_size = 0; - int cpus = 0; - int num = 0; - - for (loop = 0; loop < sizeof(perfc_name) / sizeof(char *); loop++) { - if (perfc_name[loop][0] == 'C') { - element_size = NR_CPUS; - cpus = 1; - } else { - num = sscanf (perfc_name[loop], "[%d]", &element_size); - } - - total_size += element_size == 0 ? 1 : element_size; - if (total_size > offset) break; - } - if (loop == sizeof(perfc_name) / sizeof(char *)) { - printf ("error: couldn't find variable\n"); - return; - } - if (element_size == 0) { /* single counter */ - printf ("%10lu 0x%08lx %s\n", counter[0], counter[0], - perfc_name[loop] + 2 + num); - } else if (cpus) { /* counter per CPU */ - for (loop = 0; loop < smp_num_cpus; loop++) { - printf ("%10lu 0x%08lx cpu[%02d] %s\n", - counter[loop], counter[loop], - loop, perfc_name[loop]); - } - - } else { /* show entire array */ - for (loop = 0; loop < element_size; loop++) { - printf ("%10lu 0x%08lx %s:%d\n", - counter[loop], counter[loop], - perfc_name[loop] + 2 + num, loop); - } - } - return; -} +struct perfcounter_t perfcounters; -void perfc_printall (u_char key, void *dev_id, struct pt_regs *regs) +void perfc_printall(u_char key, void *dev_id, struct pt_regs *regs) { - int loop, idx; - int element_size; - int cpus=0; - int num = 0; + int i, j; s_time_t now = NOW(); unsigned long *counters = (unsigned long *)&perfcounters; - printf ("xen performance counters: now=0x%08X%08X\n", - (u32)(now>>32), (u32)now); - - for (loop = 0; loop < sizeof(perfc_name) / sizeof(char *); loop++) { - - if (perfc_name[loop][0] == 'C') { - element_size = NR_CPUS; - cpus = 1; - } else { - num = sscanf (perfc_name[loop], "[%d]", &element_size); - } - - for (idx = 0; idx < (element_size ? element_size : 1); idx++) { - if (cpus) { - if (idx < smp_num_cpus) - printf ("%10ld 0x%08lx cpu[%02d] %s\n", - *counters, *counters, idx, perfc_name[loop] + 1); - } else if (element_size) { - printf ("%10ld 0x%08lx %s:%d\n", - *counters, *counters, perfc_name[loop] + num + 2, idx); - } else { - printf ("%10ld 0x%08lx %s\n", - *counters, *counters, perfc_name[loop] + num + 2); - } - counters++; + printk("Xen performance counters SHOW (now = 0x%08X:%08X)\n", + (u32)(now>>32), (u32)now); + + for ( i = 0; i < NR_PERFCTRS; i++ ) + { + switch ( perfc_info[i].type ) + { + case TYPE_SINGLE: + printk("%10ld 0x%08lx %s\n", + counters[0], counters[0], perfc_info[i].name); + counters += 1; + break; + case TYPE_CPU: + for ( j = 0; j < smp_num_cpus; j++ ) + printk("%10ld 0x%08lx %s[CPU %02d]\n", + counters[j], counters[j], perfc_info[i].name, j); + counters += j; + break; + case TYPE_ARRAY: + for ( j = 0; j < perfc_info[i].nr_elements; j++ ) + printk("%10ld 0x%08lx %s[ARR %02d]\n", + counters[j], counters[j], perfc_info[i].name, j); + counters += j; + break; } } - - //perfc_reset( key, dev_id, regs ); - - return; } -void perfc_reset (u_char key, void *dev_id, struct pt_regs *regs) +void perfc_reset(u_char key, void *dev_id, struct pt_regs *regs) { s_time_t now = NOW(); - printk ("xen performance counters reset: now=0x%08X%08X\n", - (u32)(now>>32), (u32)now); - memset (&perfcounters, 0, sizeof(perfcounters)); + printk("Xen performance counters RESET (now = 0x%08X:%08X)\n", + (u32)(now>>32), (u32)now); + memset(&perfcounters, 0, sizeof(perfcounters)); } diff --git a/xen/common/vsprintf.c b/xen/common/vsprintf.c index fe17225088..74285f5406 100644 --- a/xen/common/vsprintf.c +++ b/xen/common/vsprintf.c @@ -509,205 +509,3 @@ int sprintf(char * buf, const char *fmt, ...) return i; } -/** - * vsscanf - Unformat a buffer into a list of arguments - * @buf: input buffer - * @fmt: format of buffer - * @args: arguments - */ -int vsscanf(const char * buf, const char * fmt, va_list args) -{ - const char *str = buf; - char *next; - int num = 0; - int qualifier; - int base; - int field_width = -1; - int is_sign = 0; - - while(*fmt && *str) { - /* skip any white space in format */ - /* white space in format matchs any amount of - * white space, including none, in the input. - */ - if (isspace(*fmt)) { - while (isspace(*fmt)) - ++fmt; - while (isspace(*str)) - ++str; - } - - /* anything that is not a conversion must match exactly */ - if (*fmt != '%' && *fmt) { - if (*fmt++ != *str++) - break; - continue; - } - - if (!*fmt) - break; - ++fmt; - - /* skip this conversion. - * advance both strings to next white space - */ - if (*fmt == '*') { - while (!isspace(*fmt) && *fmt) - fmt++; - while (!isspace(*str) && *str) - str++; - continue; - } - - /* get field width */ - if (isdigit(*fmt)) - field_width = skip_atoi(&fmt); - - /* get conversion qualifier */ - qualifier = -1; - if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L' || *fmt == 'Z') { - qualifier = *fmt; - fmt++; - } - base = 10; - is_sign = 0; - - if (!*fmt || !*str) - break; - - switch(*fmt++) { - case 'c': - { - char *s = (char *) va_arg(args,char*); - if (field_width == -1) - field_width = 1; - do { - *s++ = *str++; - } while(field_width-- > 0 && *str); - num++; - } - continue; - case 's': - { - char *s = (char *) va_arg(args, char *); - if(field_width == -1) - field_width = INT_MAX; - /* first, skip leading white space in buffer */ - while (isspace(*str)) - str++; - - /* now copy until next white space */ - while (*str && !isspace(*str) && field_width--) { - *s++ = *str++; - } - *s = '\0'; - num++; - } - continue; - case 'n': - /* return number of characters read so far */ - { - int *i = (int *)va_arg(args,int*); - *i = str - buf; - } - continue; - case 'o': - base = 8; - break; - case 'x': - case 'X': - base = 16; - break; - case 'd': - case 'i': - is_sign = 1; - case 'u': - break; - case '%': - /* looking for '%' in str */ - if (*str++ != '%') - return num; - continue; - default: - /* invalid format; stop here */ - return num; - } - - /* have some sort of integer conversion. - * first, skip white space in buffer. - */ - while (isspace(*str)) - str++; - - if (!*str || !isdigit(*str)) - break; - - switch(qualifier) { - case 'h': - if (is_sign) { - short *s = (short *) va_arg(args,short *); - *s = (short) simple_strtol(str,&next,base); - } else { - unsigned short *s = (unsigned short *) va_arg(args, unsigned short *); - *s = (unsigned short) simple_strtoul(str, &next, base); - } - break; - case 'l': - if (is_sign) { - long *l = (long *) va_arg(args,long *); - *l = simple_strtol(str,&next,base); - } else { - unsigned long *l = (unsigned long*) va_arg(args,unsigned long*); - *l = simple_strtoul(str,&next,base); - } - break; - case 'L': - if (is_sign) { - long long *l = (long long*) va_arg(args,long long *); - *l = simple_strtoll(str,&next,base); - } else { - unsigned long long *l = (unsigned long long*) va_arg(args,unsigned long long*); - *l = simple_strtoull(str,&next,base); - } - break; - case 'Z': - { - size_t *s = (size_t*) va_arg(args,size_t*); - *s = (size_t) simple_strtoul(str,&next,base); - } - break; - default: - if (is_sign) { - int *i = (int *) va_arg(args, int*); - *i = (int) simple_strtol(str,&next,base); - } else { - unsigned int *i = (unsigned int*) va_arg(args, unsigned int*); - *i = (unsigned int) simple_strtoul(str,&next,base); - } - break; - } - num++; - - if (!next) - break; - str = next; - } - return num; -} - -/** - * sscanf - Unformat a buffer into a list of arguments - * @buf: input buffer - * @fmt: formatting of buffer - * @...: resulting arguments - */ -int sscanf(const char * buf, const char * fmt, ...) -{ - va_list args; - int i; - - va_start(args,fmt); - i = vsscanf(buf,fmt,args); - va_end(args); - return i; -} diff --git a/xen/include/xeno/lib.h b/xen/include/xeno/lib.h index 9f97ad9530..8cad54f9d1 100644 --- a/xen/include/xeno/lib.h +++ b/xen/include/xeno/lib.h @@ -47,9 +47,6 @@ extern int snprintf(char * buf, size_t size, const char * fmt, ...) __attribute__ ((format (printf, 3, 4))); extern int vsnprintf(char *buf, size_t size, const char *fmt, va_list args); -extern int sscanf(const char *, const char *, ...) - __attribute__ ((format (scanf,2,3))); -extern int vsscanf(const char *, const char *, va_list); long simple_strtol(const char *cp,char **endp,unsigned int base); unsigned long simple_strtoul(const char *cp,char **endp,unsigned int base); long long simple_strtoll(const char *cp,char **endp,unsigned int base); diff --git a/xen/include/xeno/perfc.h b/xen/include/xeno/perfc.h index 4d0164c170..723edefbe2 100644 --- a/xen/include/xeno/perfc.h +++ b/xen/include/xeno/perfc.h @@ -37,7 +37,6 @@ struct perfcounter_t }; extern struct perfcounter_t perfcounters; -extern char *perfc_name[]; #define perfc_value(x) perfcounters.x[0] #define perfc_valuec(x) perfcounters.x[smp_processor_id()] @@ -52,7 +51,3 @@ extern char *perfc_name[]; #define perfc_addc(x,y) perfcounters.x[smp_processor_id()]+=(y) #define perfc_adda(x,y,z) perfcounters.x[y]+=(z) -#define perf_print(x) \ - __perfc_print(perfcounters.x, \ - &perfcounters.x[0] - ((unsigned long *)&perfcounters)) - diff --git a/xen/include/xeno/perfc_defn.h b/xen/include/xeno/perfc_defn.h index f006079085..4487b4843d 100644 --- a/xen/include/xeno/perfc_defn.h +++ b/xen/include/xeno/perfc_defn.h @@ -1,9 +1,7 @@ + PERFCOUNTER_CPU( irqs, "#interrupts" ) PERFCOUNTER_CPU( irq_time, "cycles spent in irq handler" ) -PERFCOUNTER( blockio_tx, "block io: messages received from tx queue" ) -PERFCOUNTER( blockio_rx, "block io: messages sent on rx queue" ) - PERFCOUNTER_CPU( apic_timer, "apic timer interrupts" ) PERFCOUNTER_CPU( ac_timer_max, "ac_timer max error (ns)" ) PERFCOUNTER_CPU( sched_irq, "sched: timer" ) -- 2.30.2